package com.mrx.mxshell

import java.io.File
import java.util.*
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit

/**
 * 工具类
 */
object Utils : CmdAdapter() {
    /**
     * 当前工作目录
     */
    var currentPwd = "."
        // 保证 当前工作目录一定是以 \ 结尾的
        get() {
            return if (!field.endsWith("\\")) field + "\\"
            else field
        }
    private val pool: ExecutorService = Executors.newFixedThreadPool(4)
    fun exec(command: Runnable) {
        runCatching {
            val future = pool.submit(command)
            future.get(4, TimeUnit.SECONDS)
            future.cancel(true)
        }
    }

    /**
     * 使用给定参数获取绝对路径
     * @param param String? 参数
     * @return String 绝对路径
     */
    fun getAbsPwd(param: String?): String {
        // TODO: 适配 Linux
        // Windows 下的根目录是以 盘符: 开头的
        // 如果 CD 的路径不是以 盘符: 开头的, 代表输入的是相对路径, 用当前工作目录 + 相对路径 得到 绝对路径
        param!!
        return when {
            ".." == param -> currentPwd.toFile().parent
            ":" !in param -> currentPwd + param
            // 否则就说明输入的 绝对路径, 直接返回
            else -> param
        }

    }

    /**
     * 输出所给字符
     * @param msg CharSequence 要输出的内容
     */
    fun print(msg: CharSequence) {
        println("\n$msg\n")
    }

    /**
     * 获取指定路径下的所有文件 ( 夹 )
     * @param path File 路径
     * @return StringBuilder 以回车符隔开的绝对路径字符串
     */
    fun listFiles(path: File): StringBuilder {
        val sb = StringBuilder()
        path.listFiles()!!.apply {
            sortBy {
                // 先输出文件夹, 再输出文件
                if (it.isFile) 1
                else 0
            }
        }.forEach {
            sb.append(it.absolutePath).append("\n")
        }
        return sb
    }

    fun recursionListFiles(
        path: File = currentPwd.toFile(),
        files: LinkedList<File> = LinkedList<File>()
    ): LinkedList<File> {
        val filesInThisFolder = path.listFiles()!!
        for (file in filesInThisFolder) {
            files.push(file)
            if (file.isDirectory) recursionListFiles(file, files)
        }
        return files
    }

    override fun getParamStatus(): ParamStatus {
        throw IllegalAccessException("该类只是工具类！")
    }

}